package com.probiz.estore.content.dao;

import com.probiz.estore.common.model.catalog.ContentCategory;
import com.probiz.estore.common.model.content.Content;
import com.probiz.estore.content.model.ContentSearchCriteria;
import com.probiz.estore.core.dao.GenericDao;
import com.probiz.estore.core.search.SearchCriteria;

import java.util.List;

/**
 * Dao interface for Content.
 */
public interface ContentDao extends GenericDao<Content> {
    /**
     * 根据目录id获得直接所属文章个数
     *
     * @param categoryId 目录id
     * @return 直接所属文章个数
     */
    public Integer countContentByCategoryId(Integer categoryId);

    /**
     * 搜索文章
     *
     * @param contentSearchCriteria 自定义搜索条件
     * @param searchCriteria        分页搜索条件
     * @return 文章列表结果
     */
    public List<Content> searchByCriteria(ContentSearchCriteria contentSearchCriteria, SearchCriteria searchCriteria);
    
    /**
     * 获取文章列表
     * @param contentSearchCriteria 自定义搜索条件
     * @param firstResult 开始
     * @param maxResults 最多个数
     * @return 文章列表
     */
    public List<Content> getContentList(final ContentSearchCriteria contentSearchCriteria,final int firstResult, final int maxResults);

    /**
     * 根据目录获得所属文章个数,包括子孙目录的文章
     *
     * @param contentCategory 内容目录
     * @return 文章总数
     */
    public Integer countContentIncludeAllByCategory(ContentCategory contentCategory);

    /**
     * 根据目录获得激活所属文章个数,包括子孙目录的文章
     *
     * @param contentCategory 内容目录
     * @return 文章总数
     */
    public Integer countActiveContentIncludeAllByCategory(ContentCategory contentCategory);

    /**
     * 获取所有过期文章
     *
     * @return 过期文章列表
     */
    public List<Content> getAllExpiredContents();

    /**
     * 获取所有要从等待发布转为发布中的文章
     *
     * @return 所有要从等待发布转为发布中的文章
     */
    public List<Content> getAllToPulishedContents();

    /**
     * 获得指定数量和特定目录下(包括子目录)推荐的文章(sortOrder较小)
     *
     * @param category 指定目录
     * @param size     指定数量
     * @return 推荐文章
     */
    public List<Content> getRecommendedContents(final ContentCategory category, final int size);

    /**
     * 获得指定数量和特定目录下(包括子目录)最新的文章(publishTime较晚)
     *
     * @param category 指定目录
     * @param size     指定数量
     * @return 推荐文章
     */
    public List<Content> getNewestContents(final ContentCategory category, final int size);

    /**
     * 获得指定数量和特定目录下(包括子目录)相关的文章(关键词相关)
     *
     * @param contentId 文章id
     * @param size      指定数量
     * @return 推荐文章
     */
    public List<Content> getRelatedContents(final Integer contentId, final int size);
    /**
	 * 根据fieldName改变统计对应field的值。count为改变数量，可以为正，也可以为负。
	 */
	public void updateStatField(final Integer contentStatId,final String fieldName,final Integer count);

}